"""
封装所有页面对象共性的操作，比如driver 的实例化
"""

import yaml
from selenium import webdriver
import time

from selenium.webdriver.remote.webelement import WebElement

from SELENIUM_TEST.wx.settings import CONFIG_DIR


def get_cookies():
    driver = webdriver.Chrome()
    # 访问企业微信通讯录，如果未登录，会自动跳转到二维码登录页
    driver.get("https://work.weixin.qq.com/wework_admin/frame#contacts")
    # 等待人工扫码完成登录
    time.sleep(20)
    # 在登录完成之后，调用获取cookie
    cookies = driver.get_cookies()
    # 将cookie存入到一个可持久存储的地方

    with open(CONFIG_DIR + "/cookies.yaml", "w") as f:
        yaml.safe_dump(cookies, f)


class BasePage:
    _base_url = None

    def __init__(self, base_driver=None):
        """通过base_driver告诉父类的构造函数，如果传参了，不需要进行重复的实例化操作（避免每个页面实例化的时候都初始化一个新的浏览器）
        如果没有传参， 那么就是第一次的实例化操作，需要进行实例化
        """
        if base_driver:
            self.driver = base_driver
        else:
            self.driver = webdriver.Chrome()
            self.driver.implicitly_wait(3)
            if self._base_url != None:
                self.driver.get(self._base_url)
                # 加载cookie
                cookies = yaml.safe_load(open(CONFIG_DIR + "/cookies.yaml"))
                for cookie in cookies:
                    self.driver.add_cookie(cookie)
                time.sleep(3)
                self.driver.get(self._base_url)
            else:
                raise ValueError("_base_url is None, _base_url必须定义")

    def find(self, by, locator) -> WebElement:
        """封装查找操作"""
        res = self.driver.find_element(by, locator)
        print(f"找到了元素：by={by},locator={locator}")
        return res

    def click(self,by, locator) -> None:
        """ 封装点击操作"""
        self.find(by, locator).click()
        print(f"点击了元素；by={by},locator={locator}")

    def send_keys(self,by, locator,*value) -> None:
        """ 封装输入操作 """
        self.find(by, locator).send_keys(*value)
        print(f"输入了内容：{value}")

if __name__ == '__main__':
    get_cookies()
